package tt.lab.designparttern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

  
public class DynamicProxyTest {  
public static Object proxy;  
    public static void main(String[] args) {  
  
        HelloWorld hw = new HelloWorldImpl();  
  
        InvocationHandler handler = new HelloWorldHandler(hw);  
  
        HelloWorld proxy = (HelloWorld) Proxy.newProxyInstance(hw.getClass()  
                .getClassLoader(), hw.getClass().getInterfaces(), handler);  
        proxy.sayHelloWorld();  
          
        //判断是否生成的代理对象  
        System.out.println(DynamicProxyTest.proxy == proxy);  
    }  
  
}  
  
class HelloWorldHandler implements InvocationHandler {  
    // 要代理的原始对象  
    private Object objOriginal;  
  
    /** 
     * 构造函数。 
     *  
     * @param obj 
     *            要代理的原始对象。 
     */  
    public HelloWorldHandler(Object obj) {  
        this.objOriginal = obj;  
    }  
  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
  
        Object result;  
  
        // 方法调用之前  
        doBefore();  
          
        //把这个proxy的引用保存在DynamicProxyTest.proxy，以便之后判断是否是生成的代理对象  
        DynamicProxyTest.proxy = proxy;  
        // 调用原始对象的方法  
        result = method.invoke(this.objOriginal, args);  
  
        // 方法调用之后  
        doAfter();  
  
        return result;  
    }  
  
    private void doBefore() {  
        System.out.println("before method invoke!");  
    }  
  
    private void doAfter() {  
        System.out.println("after method invoke!");  
    }  
  
}  
  
class HelloWorldImpl implements HelloWorld {  
    public void sayHelloWorld() {  
        System.out.println(this+"Hello World!");  
    }  
}  
  
interface HelloWorld {  
    void sayHelloWorld();  
}  